package com.star.vrserver.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.star.vrserver.exception.StarException;
import com.star.vrserver.entity.User;
import com.star.vrserver.entity.vo.PageVO;
import com.star.vrserver.entity.query.UserQuery;
import com.star.vrserver.mapper.UserMapper;
import com.star.vrserver.service.UserService;
import com.star.vrserver.utils.JWTUtil;
import com.star.vrserver.utils.MD5Util;
import lombok.SneakyThrows;
import org.springframework.stereotype.Service;


/**
 * @author star
 * @date 2023-03-07 20:05
 * @Description userService实现类
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    //带条件分页方法实现
    @Override
    public PageVO<User> pageList(long current, long limit, UserQuery userQuery) {
        PageVO<User> pageVO = new PageVO<>();
        //创建page对象
        Page<User> pageUser = new Page<>(current, limit);
        //构建条件
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // 多条件组合查询 mybatis学过 动态sql
        String name = userQuery.getName();
        String begin = userQuery.getBegin();
        //判断条件值是否为空，如果不为空拼接条件
        if (!"".equals(name)) {
            //构建条件
            wrapper.like("name", name);
        }
        if (!"".equals(begin)) {
            wrapper.ge("gmt_create", begin);
        }
        //添加排序
        wrapper.orderByDesc("gmt_create");
        //调用方法实现条件查询分页：调用page方法后查询结果放在userPage对象中
        this.page(pageUser, wrapper);
        //将分页结果放到pageVO中
        pageVO.setTotal(pageUser.getTotal());
        pageVO.setRecords(pageUser.getRecords());
        return pageVO;
    }

    //注册用户的方法具体实现：加上了密码加密和手机号是否可用的验证
    @SneakyThrows
    @Override
    public boolean save(User user) {
        //注册用户时验证手机号是否已经被注册
        //已经被注册：提示用户该号码已被注册
        if (!this.isTelAvailable(user.getTel())) {
            throw new StarException(20004, "该号码已被注册！");
        }
        //没有被注册：执行注册操作
        //对用户密码进行加密
        String password = MD5Util.enCodeMD5(user.getPassword());
        //重设user对象的password
        user.setPassword(password);
        return SqlHelper.retBool(this.getBaseMapper().insert(user));
    }

    //用户登录
    @Override
    public String userLogin(String tel, String password) {
        //将用户输入的密码进行加密，然后匹配数据库中的密码
        String pwd = MD5Util.enCodeMD5(password);
        //  使用lambda链式查询：LambdaQueryChainWrapper：查询手机号和密码是否匹配
        User user = this.lambdaQuery()
                .eq(User::getTel, tel)
                .eq(User::getPassword, pwd).one();
        //登录失败：在数据库中未找到该用户的信息
        if (user == null) {
            throw new StarException(20005, "登录失败！请检查您的手机号和密码！");
        }
        //登录成功：下发token
        return JWTUtil.createToken(tel);
    }

    //验证手机号是否可用：配合注册使用
    @Override
    public boolean isTelAvailable(String tel) {
        return this.lambdaQuery().eq(User::getTel, tel).one() == null;
    }
}
